#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;

int q[N];//记录的是长度为i的上升子序列中尾巴最小的数

int n;
int arr[N];
int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>arr[i];
    int len=0;
    q[0]=-2e9;//避免第一次二分mid为0此时一定有长度为1的答案是无法找到答案
    for(int i=0;i<n;i++)
    {
        //便利所有数看一下该数字可以放在哪一个长度为len上升子序列后面
        int l=0,r=len,ans=-1;
        while(l<=r)
        {
            //二分找小于等于a[i]的右端点
            int mid=(r-l)/2+l;
            if(arr[i]>q[mid])
            {
                ans=mid;
                l=mid+1;
            }
            else
            {
                r=mid-1;
            }
        }
        //ans就是q数组的下标也是长度
        len=max(len,ans+1);
        q[ans+1]=arr[i];
    }
    cout<<len<<endl;
}